package cn.oracle.eshop.Inventory.command;

import cn.oracle.eshop.Inventory.constant.StockStatus;
import cn.oracle.eshop.Inventory.dao.GoodsStockDAO;
import cn.oracle.eshop.Inventory.domain.GoodsStockDO;
import cn.oracle.eshop.comment.util.DateProvider;
import lombok.extern.slf4j.Slf4j;

import java.util.List;

/**商品库存更新命令的抽象基类
 * @author wyh
 * @ClassName AbstractGoodsStockUpdaterCommand
 * @date 2022/3/29 /22:36
 */
@Slf4j
public abstract class AbstractGoodsStockUpdaterCommand implements GoodStockUpdateCommand {

    /**商品库存DO对象*/
    protected List<GoodsStockDO> goodsStockDOs;
    /**商品库存管理模块的DAO组件*/
    protected GoodsStockDAO goodsStockDAO;
    /**日期辅助组件*/
    protected DateProvider dateProvider;
    /***
     * 构造函数
     * @author wyh
     * @date 2022/3/29
     * @param goodsStockDOs 商品库存的do对象
     * @param goodsStockDAO 商品库存管理模块的DAO组件
    */
    public AbstractGoodsStockUpdaterCommand(List<GoodsStockDO> goodsStockDOs,
                                            GoodsStockDAO goodsStockDAO,
                                            DateProvider dateProvider){
        this.goodsStockDOs = goodsStockDOs;
        this.dateProvider = dateProvider;
        this.goodsStockDAO=goodsStockDAO;
    }


    /***
     * @Descipon:  更新商品库存
     * @author wyh
     * @date 2022/3/29
     * @return java.lang.Boolean
    */
    @Override
    public Boolean updateGoodsStock() {

        try {
            updateSaleStockQuantity();
            updateLockedStockQuantity();
            updateSaledStockQuantity();
            updateStockStatus();
            updateGmatModified();
            executeUpdateGoodsStock();
        }catch (Exception e){
            log.error("更新商品库存发生错误:{},{}",e.getMessage(),e);
            return false;
        }
        return true;
    }
    /**更新商品的销售库存*/
    protected abstract void updateSaleStockQuantity() ;
    /**更新商品的锁定库存*/
    protected abstract void updateLockedStockQuantity() ;
    /**更新商品的已销售库存*/
    protected abstract void updateSaledStockQuantity();
     /**更新商品的库存状态*/
     private void updateStockStatus() throws Exception {
         for(GoodsStockDO goodsStockDO : goodsStockDOs) {
             if(goodsStockDO.getSaleStockQuantity() > 0L) {
                 goodsStockDO.setStockStatus(StockStatus.IN_STOCK);
             } else {
                 goodsStockDO.setStockStatus(StockStatus.NOT_IN_STOCK);
             }
         }
     }


    /**更新商品库存的修改时间*/
    private void updateGmatModified() throws Exception {
        for(GoodsStockDO goodsStockDO : goodsStockDOs) {
            goodsStockDO.setGmtModified(dateProvider.getCurrentTime());
        }
    }
    /**
     * 实际执行更新商品库存的操作
     */
    private void executeUpdateGoodsStock() throws Exception {
        for(GoodsStockDO goodsStockDO : goodsStockDOs) {
            goodsStockDAO.updateGoodsStock(goodsStockDO);
        }
    }
}

